package unmsm.fisi.tesis.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import unmsm.fisi.tesis.persistencia.HmDetalleenfermedad;
import unmsm.fisi.tesis.persistencia.HmEstablecimientosalud;
import unmsm.fisi.tesis.persistencia.HmEvaluacion;
import unmsm.fisi.tesis.persistencia.HmHistoriaclinica;
import unmsm.fisi.tesis.persistencia.HmPaciente;
import unmsm.fisi.tesis.util.HibernateUtil;
import unmsm.fisi.tesis.vo.EnfermedadVO;
import unmsm.fisi.tesis.vo.EvaluacionVO;
import unmsm.fisi.tesis.vo.ExamenVO;

public class HistoriaClinicaDAO {
	
	private SessionFactory sessionFactory;

	public HistoriaClinicaDAO() {
		// TODO Auto-generated constructor stub
		
	}
	
	public void ingresarDatos(ExamenVO examenVO){
		
		sessionFactory = HibernateUtil.getSessionFactory();
		
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		
		
		// agregar hm_paciente : nombres, apellidopaterno, apellidomaterno
		HmPaciente paciente= new HmPaciente();
		paciente.setApellidopaterno(examenVO.getDatosPaciente().getApellidoPaterno());
		paciente.setApellidomaterno(examenVO.getDatosPaciente().getApellidoMaterno());
		paciente.setNombres(examenVO.getDatosPaciente().getNombres());
		
		//agregar hm_establecimientosalud : descripcion
		HmEstablecimientosalud establecimientosalud = new HmEstablecimientosalud();
		establecimientosalud.setDescripcion(examenVO.getDatosPaciente().getEstablecimientoSalud());
		
		//agregamos con el objeto hm_paciente y hm_establecimientosalud generado lineas
		//arriba un registro a hm_historiaclinica con numerohistoria				
		HmHistoriaclinica historiaclinica= new HmHistoriaclinica();
		historiaclinica.setHmPaciente(paciente);
		historiaclinica.setHmEstablecimientosalud(establecimientosalud);
		historiaclinica.setNumerohistoria(examenVO.getDatosPaciente().getNumeroHistoria());
		historiaclinica.setFechaRegistro(examenVO.getDatosPaciente().getFechaAtencion());
		
		session.save(historiaclinica);
		
		//agregamos todas las evaluaciones 
		//con el id de hm_historiaclinica generado arriba con
		// valor y iddetalleenfermedad
		for(EvaluacionVO temp: examenVO.getListaEvaluaciones()){
			
			HmEvaluacion evaluacion= new HmEvaluacion();
			evaluacion.setValor1(temp.getValor1());
			evaluacion.setValor2(temp.getValor2());
			evaluacion.setHmHistoriaclinica(historiaclinica);
			
			HmDetalleenfermedad detalleenfermedad=(HmDetalleenfermedad) session.get(HmDetalleenfermedad.class, temp.getCodigoDetalleEnfermedad());
			evaluacion.setHmDetalleenfermedad(detalleenfermedad);
			
			historiaclinica.getHmEvaluacions().add(evaluacion);
			session.save(evaluacion);
			
		}
		
		session.getTransaction().commit();
		
	}
	
	public List<EnfermedadVO> obtenerDetalleEnfermedades(){
		
		List<EnfermedadVO> enfermedadVOs= new ArrayList<EnfermedadVO>();
		sessionFactory = HibernateUtil.getSessionFactory();
		
		try {
		
		Session session = sessionFactory.openSession();
		
		Transaction tx= session.beginTransaction();
		
		Query q = session.createQuery("from HmDetalleenfermedad order by iddetalleenfermedad asc");
		
		List<HmDetalleenfermedad> resultList = q.list();
		
		
		for(HmDetalleenfermedad hmDetalleenfermedad:resultList){
			
			EnfermedadVO enfermedadVO= new EnfermedadVO();
			enfermedadVO.setIdNombreTecnico(hmDetalleenfermedad.getIddetalleenfermedad());
			enfermedadVO.setNombreTecnico(hmDetalleenfermedad.getNombretecnico());
			
			enfermedadVOs.add(enfermedadVO);
			
		}
		
        session.getTransaction().commit();
        
		
		} catch (HibernateException he) {
	        he.printStackTrace();
	    }
		
		return enfermedadVOs;
	}

}
